package com.ruoyi.common.utils.paging;

import cn.hutool.core.util.ObjectUtil;
import com.baomidou.mybatisplus.core.metadata.OrderItem;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.github.pagehelper.PageInfo;
import com.ruoyi.common.core.domain.BizBaseEntity;
import com.ruoyi.common.core.page.PageDomain;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * PagingUtils
 *
 * @author HHKJ-SERVER-ZJ
 * @since 2024/1/25 9:14
 */
public class PagingUtils {

    /**
     * 酱Paging转为为pageInfo
     *
     * @param pagePo 分页信息
     * @param <Po>   但会类型
     * @return 返回信息
     */
    public static <Po extends BizBaseEntity> PageInfo<Po> toPageInfoPo(Page<Po> pagePo) {
        PageInfo<Po> pageInfo = new PageInfo<>(pagePo.getRecords());
        pageInfo.setIsFirstPage(pagePo.hasPrevious());
        pageInfo.setIsLastPage(pagePo.hasNext());
        pageInfo.setPageNum((int) pagePo.getCurrent());
        pageInfo.setPageSize((int) pagePo.getSize());
        pageInfo.setSize(pagePo.getRecords().size());
        pageInfo.setPages((int) pagePo.getPages());
        pageInfo.setTotal((int) pagePo.getTotal());
        if (pagePo.getRecords().isEmpty()) {
            pageInfo.setStartRow(0);
            pageInfo.setEndRow(0);
        } else {
            pageInfo.setStartRow(pagePo.getSize() * (pagePo.getPages() - 1) + 1);
            pageInfo.setEndRow(pageInfo.getStartRow() - 1 + pageInfo.getSize());
        }
        return pageInfo;
    }

    /**
     * 转化成pageDo实体类
     *
     * @param conditionDo 数据库请求实体
     * @return 分页信息
     */
    public static <Do extends BizBaseEntity> Page<Do> toPageDo(Do conditionDo) {
        return toPageDo(conditionDo, new HashMap<>());
    }

    /**
     * 转化成pageDo实体类
     *
     * @param conditionDo    请求信息
     * @param orderColumnMap 列map
     * @param <Do>           请求类
     * @return 分页信息
     */
    public static <Do extends BizBaseEntity> Page<Do> toPageDo(Do conditionDo, Map<String, String> orderColumnMap) {
        PageDomain pageDomain = ObjectUtil.isNull(conditionDo.getPageDomain()) ? PageDomain.initPageDomain() : conditionDo.getPageDomain();
        Page<Do> pageDo = new Page<>(pageDomain.getPageNum(), pageDomain.getPageSize());
        // 排序
        List<OrderItem> orderItems = new ArrayList<>();
        OrderItem orderItem = "asc".equals(pageDomain.getIsAsc()) ?
                OrderItem.desc(orderColumnMap.getOrDefault(pageDomain.getOrderByColumn(), "id")) :
                OrderItem.asc(orderColumnMap.getOrDefault(pageDomain.getOrderByColumn(), "id"));

        orderItems.add(orderItem);
        orderItems.add(OrderItem.desc(orderColumnMap.getOrDefault("id", "id")));
        pageDo.setOrders(orderItems);
        return pageDo;
    }
}
